package com.xxx.simple;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * Rabbit MQ使用场景一：简单模式——1个生产者，1个消费者（一对一）
 * producer(生产者)端步骤：
    (1)：创建ConnectionFactory，并且设置一些参数，比如hostname,portNumber等等
    (2)：利用ConnectionFactory创建一个Connection连接
    (3)：利用Connection创建一个Channel通道
    (4)：创建queue并且和Channel进行绑定
    (5)：创建消息，并且发送到队列中
     注意，在我们当前的例子中，并没有用到exchange交换机，RabbitMQ默认情况下是会创建一个空字符串名字的exchange的，
     如果我们没有创建自己的exchange的话，默认就是使用的这个exchange；
 * 
 * @author guweiqiang
 * 2018年6月13日
 */
public class Producer {
	
	// 队列名称
	private static final String QUEUE_NAME = "rabbitMQ.test";
	
	// rabbit MQ server host
//	private static final String HOST = "localhost";
	
	public static void main(String[] args) throws IOException, TimeoutException {
		// 1.创建连接工厂，并设置工厂相关属性
		ConnectionFactory factory = new ConnectionFactory();
//		factory.setHost(HOST); // MQ server host，不设置默认为localhost
		
		// 2.创建一个连接
		Connection connection = factory.newConnection();
		
		// 3.创建一个通道
		Channel channel = connection.createChannel();
		
		// 4.声明一个队列
		channel.queueDeclare(QUEUE_NAME, false, false, false, null);
		// 第一个参数表示队列名称
		// 第二个参数为是否需要持久化（true表示是，队列将在服务器重启时生成）
		// 第三个参数为是否是独占队列（创建者可以使用的私有队列，断开后自动删除）
		// 第四个参数为当所有消费者客户端连接断开时是否自动删除队列
		// 第五个参数为队列的其他参数
		
		// 5.往队列里发送消息
		for(int i=1;i<=10;i++) {
			String message = "hello world"+i;
			channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
			// 第一个参数为交换机名称（这里设置为空）
			// 第二个参数为队列映射的路由key（这里设置和队列名一样）
			// 第三个参数为消息的其他属性
			// 第四个参数为发送信息的主体
			System.out.println("send message：" + message);
		}
		
		// 6.关闭连接
//		channel.close();
//		connection.close();
	}

}
